// import com.alibaba.druid.sql.SQLUtils;
// import com.alibaba.druid.sql.ast.SQLCommentHint;
// import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
// import com.alibaba.druid.util.FnvHash;

// import java.sql.Types;
// import java.util.List;
#pragma once

#include <string>
#include <list>

#include "../SQLExpr.h"
#include "../SQLExprImpl.h"
#include "../Object.h"
#include "../SQLCommentHint.h"
#include "../SQLDataTypeImpl.h"

class SQLCharacterDataType : virtual public SQLDataTypeImpl
{
public:
  string_ptr charSetName;
  string_ptr collate;

  string_ptr charType;
  BOOL_ptr hasBinary;

  SQLCommentHint_list_ptr hints;

  static string_ptr CHAR_TYPE_BYTE;
  static string_ptr CHAR_TYPE_CHAR;

  SQLCharacterDataType(string_ptr name);

  // SQLCharacterDataType(string_ptr  name, int precision) ;

  string_ptr getCharSetName();

  void setCharSetName(string_ptr charSetName);

  BOOL_ptr isHasBinary();

  void setHasBinary(BOOL_ptr hasBinary);

  string_ptr getCollate();

  void setCollate(string_ptr collate);

  string_ptr getCharType();

  void setCharType(string_ptr charType);

  SQLCommentHint_list_ptr getHints();

  void setHints(SQLCommentHint_list_ptr hints);

  // int getLength() {
  //     if (this->arguments.size() == 1) {
  //         SQLExpr_ptr arg = this->arguments->get(0);
  //         if (arg instanceof SQLIntegerExpr) {
  //             return ((SQLIntegerExpr) arg).getNumber().intValue();
  //         }
  //     }

  //     return -1;
  // }

  // void accept0(SQLASTVisitor* visitor) {
  //     if (visitor->visit(this)) {
  //         for (int i = 0; i < arguments->size(); i++) {
  //             SQLExpr_ptr arg = arguments->get(i);
  //             if (arg != NULL) {
  //                 arg->accept(visitor);
  //             }
  //         }
  //     }

  //     visitor->endVisit(this);
  // }

  // SQLCharacterDataType* clone();
  virtual SQLObject_ptr clone();

  // string_ptr  toString() {
  //     return SQLUtils.toSQLString(this);
  // }

  int jdbcType();
};
